/* 新增 修改 表单信息相关逻辑 */
import { reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { api as Request } from '@/utils/api';
import { isObject, isEmptyObject } from '@/shared/index.js';
/**
 * 
 * @param {object} _formData 表单对象
 * @returns 
 */
export const useForm = (_formData) => {
  const formRef = ref('');/* 表单组件的引用 */
  const methodType = ref('POST');/* 请求类型 */
  const isDisabledbtn = ref(false);/* 按钮显示或隐藏 */
  /* 表单数据 */
  const formData = reactive(_formData);

  handleInitVerify();
  /* 初始化校验参数 */
  function handleInitVerify () {
    if (!isObject(_formData) || isEmptyObject(_formData)) console.error('表单数据需要是一个非空对象');
  }

  /* 清除初始化数据 */
  function handleClearData () {
    isDisabledbtn.value = false;
    methodType.value = 'POST';
    formRef.value.resetFields && formRef.value.resetFields();
  }
  /**
   * 表单的保存或编辑的校验
   * @param {function or undefined} handleValidAssignment 额外操作：如自定义校验，数据处理(赋值)
   * handleValidAssignment有4种情况
   * 1.没有传，2.传了，但是没有返回值 undefined，3.传了，返回值是 false 和 true 
   */
  const handleFormValid = (handleValidAssignment) => {
    return new Promise((resolve, reject) => {
      formRef.value.validate((valid) => {
        if (!valid) {
          ElMessage.warning('请正确填写所有必填信息');
          reject('数据校验失败');/* 需不需要执行reject方法，我现在还不清楚，执行不执行都不影响结果 */
          return false;
        }
        if (handleValidAssignment) {
          const result = handleValidAssignment();
          if (result !== undefined && !result) {
            reject('数据校验失败');/* 需不需要执行reject方法，我现在还不清楚，执行不执行都不影响结果 */
            return false;
          }
        }
        resolve();
      });
    })
  }

  /* 新增编辑表单数据 */
  function submitFormInfo (method) {
    return Request[method](formData, methodType.value)
  }

  return {
    formRef, formData, methodType, isDisabledbtn,
    handleClearData, submitFormInfo, handleFormValid
  }
}